package com.zzy.repository;

import com.zzy.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.Repository;
import org.springframework.data.repository.query.Param;

import java.io.Serializable;
import java.util.List;

/**
 * spring dataJPA 的respository
 */
public interface UserRepository extends
        Serializable,
        Repository<User, String>,
        PagingAndSortingRepository<User,String>,
        JpaRepository<User,String> {

    List<User> findByNameAndAddress(String name, String address);

    @Query(value = "from User u where u.name=:name")
    List<User> findByName1(@Param("name") String name);

    // 使用 sql 查询
    @Query(value = "select * from #{#entityName} u where u.name=?1", nativeQuery = true)
    List<User> findByName2(String name);

    List<User> findByName(String name);

    /*
    这里将编写两个Repository接口，仅仅用于示例，实际中可以合并成一个：
    这里的UserJpaRepository接口实现了JpaRepository接口；

实际上JpaRepository实现了PagingAndSortingRepository接口，PagingAndSortingRepository接口实现了CrudRepository接口，CrudRepository接口实现了Repository接口；

简单说明下：

Repository接口是一个标识接口，里面是空的；

CrudRepository接口定义了增删改查方法；

PagingAndSortingRepository接口用于分页和排序；

由于JpaRepository接口继承了以上所有接口，所以拥有它们声明的所有方法；

另外注意下，以findAll方法为例，JpaRepository接口返回的是List, PagingAndSortingRepository和CrudRepository返回的是迭代器；

     */

}
